package com.th;

/**
 * @version 1.0
 * @Author: 许啸林
 * @Date: 2021/8/27 13:55
 * 通过继承Thread类创建线程
 */
public class ThreadSt01 {
    public static void main(String[] args) throws InterruptedException {
        Cat cat = new Cat();
        // 当有新线程创建时,不会影响到主线程的执行,而是新线程和主线程交替执行
        // 主线程结束不一定会造成进程结束,当进程内所有线程结束时进程才会停止
        // 启动线程 最终会执行cat的run方法
        // 如果直接使用run 方法执行,主线程会被阻塞
        /*
          start() 方法中真正实现创建线程的方法是start0()
          start0 由jvm调用
            boolean started = false;
            try {
                start0();
                started = true;
            } finally {
                try {
                    if (!started) {
                        group.threadStartFailed(this);
                    }
                } catch (Throwable ignore) {
                    *//* do nothing. If start0 threw a Throwable then
                      it will be passed up the call stack *//*
                }````
        }*/
        cat.start();
        for(int i=0; i<100; i++) {
            System.out.println("主线程执行循环 " + i);
            Thread.sleep(1000);
        }

    }

}

/**
 * 1. 当一个类继承了 Thread 类,该类就可以当作线程来使用
 * 2. 继承 Thread 类后重写 run 方法实现业务
 * 3. Thread 类中的 run 方法重写了 Runable 接口中的 run 方法
 */
class Cat extends Thread {

    @Override
    public void run() {
        int tag = 0;
        while ( ++tag <= 100) {
            System.out.println("小猫吃鱼 " + tag + "线程名: " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}